#ifndef __OOP_H_
#define __OOP_H_
#include <iostream>

class Fraction
{
public:
    Fraction(int num, int den=1)
        : m_numerator(num), m_denominator(den) {}
    operator double() const {  //转换函数没有返回类型. 通常都会加上const
        return double(m_numerator) / m_denominator; //整数相除得到小数，需要把一个整数转换成double
    }
private:
    int m_numerator;        // 分子
    int m_denominator;      // 分母
};

template<class T>
class shared_ptr
{
    public:
        T& operator*() const 
        {   return *px; }
        T* operator->() const
        {   return px;  }
    
    shared_ptr(T* p) : px(p) {}
private:
    T* px;
    long* pn;
};
struct Foo 
{
    void method(void) {}
};
// shared_ptr<Foo> sp(new Foo);
// Foo f(*sp);
// sp->method(); // -> 得到的对象会一直使用->指下去.
// px->method();

template <class T>
inline
const T& min(const T& a, const T& b)
{
    return b < a ? b : a;
}
// 编译器会对function template 进行实参推导

#endif